/**
 * Trả về data, nếu data là null thì trả về chuỗi rỗng
 */
function getNotNullVal(data, opt){
    if(data == null)
        if(opt != null) return opt; else return "";
    return data;
}
/**
 * Gửi kết quả đến server, dùng ajax.
 * @url (String) địa chỉ server
 * @data (JSON) tham số gửi đi (dạng post)
 * @showDark (Boolean) hiện màn hình đen, nhằm ngăn người dùng click
 * @afterSuccessFunc (Function) hàm xử lý nếu gửi đi thành công
 * @afterErrorFunc (Function) hàm xử lý nếu gửi đi thất bại
 */
function postData(url, data, showDark, afterSuccessFunc, afterErrorFunc){
    if(showDark == null || showDark == true){
        showDarkArea();
        showDark = true;
    }
    try{
        document.havecall = true;
        data = data || {};
        data.userid = document.b_userid;
        data.hdPassword = document.b_hdPassword;
        data.sessionid = document.b_sessionid;
        $.ajax({
            type: 'POST',
            dataType: 'html',
            url: url,
            data: data,
            contentType:'application/x-www-form-urlencoded;charset=utf-8',
            cache: false,
            timeout: 300000,
            success: function(data, textStatus, jqXHR){
                hideErrorPanel();
                if(showDark == true){
                    removeDarkArea();
                    showDark = false;
                }

                if(data == ""){
                    showErrorPanel("Không thể kết nối đến server, bạn liên hệ core để khắc phục lỗi này, cảm ơn.");
                    return;
                }
                if(data == "request2times"){
                    alert("Không xử lý cho việc truy vấn cùng lúc cho cùng một client");
                    return;
                }

                if(afterSuccessFunc && afterSuccessFunc instanceof Function)
                    afterSuccessFunc(data, textStatus, jqXHR);
                else{
                    defaultPostSuccess(data);
                }
            },
            error: function(jqXHR, textStatus, errorThrown){
                if(showDark == true){
                    removeDarkArea();
                    showDark = false;
                }
                if(afterErrorFunc && afterSuccessFunc instanceof Function)
                    afterErrorFunc(jqXHR, textStatus, errorThrown);
                else{
                    showErrorPanel("Không thể kết nối đến server, bạn liên hệ core để khắc phục lỗi này, cảm ơn.");
                }
            },
            complete: function(){
                if(showDark == true){
                    removeDarkArea();
                    showDark = false;
                }
            }
        });
    }catch(ex){
        if(showDark == true){
            removeDarkArea();
            showDark = false;
        }
        showErrorPanel("Có lỗi trong quá trình truyền dữ liệu, có thể server đã bị lỗi, bạn vui lòng liên hệ core để khắc phục. Cảm ơn");
    }
}

/**
 * Hàm xử lý lỗi từ kết quả trả về của server (tìm thẻ lỗi, nếu có hiển thị nội
 * dung, và trả về true, nếu ko có thì trả về false;
 * @htmlData (jQuery) biến jQuery parse từ kết quả trả về của server.
 * @return (Boolean) nếu có thẻ lỗi (thẻ notice có attribute stop_exec=true) trả về true,
 * ngược lại trả về false.
 */
function processPostIfError($htmlData){
    if($htmlData == null || (!$htmlData instanceof jQuery))
        return null;
    var errorEle = $htmlData.children("notice[stop_exec='true']");
    if(errorEle.length > 0){
        var onClose = null;
        var url = errorEle.attr("redirect");
        if(url != null && url.length > 0){
            onClose = function(){
                document.location = url;
            }
        }
        defaultProcessNoticeNode(errorEle[0], "Lỗi", onClose);
        return true;
    }
    return false;
}

/**
 * Lấy nội dung JSON từ kết quả trả về của server, nếu có thẻ lỗi thì hiển thị
 * lỗi, trả về null.
 * @data (String) kết quả trả về từ server.
 * @id (String) id của thẻ JSON.
 * @return gọi hàm <b>processPostIfError</b> nếu kết quả là true thì trả về null,
 * ngược lại trả về biến kiểu JSON.
 */
function getJSONOrShowError(data, id){
    var $htmlData = $(data);
    if(processPostIfError($htmlData)){
        return null;
    }
    var jsonele = $htmlData.children("json" + (id?"#" + id:""));
    if(jsonele.length == 0)
        return null;
    return jQuery.parseJSON(getFirstChildCommentData(jsonele));

}

/**
 * Hàm xử lý kết quả tra về từ server, thứ tự thực hiện:
 * Tìm các thẻ lỗi, nếu có hiển thị thẻ lỗi, trả về null.
 * Tìm các thẻ thông báo, nếu có hiện thị.
 * Tìm các thẻ Javascript và HTML, nếu thẻ không có parentHref(tham số cho biết gán giá
 * trị vào thẻ nào thì gán vào content panel, nếu có thì gán vào thẻ có parentHref.
 * Trả về biến jQuery đã parse.
 *
 * @data (String) chuỗi trả về từ server.
 * @return (jQuery) parse chuỗi kết quả thành jQuery object.
 */
function defaultPostSuccess(data){
    var $htmlData = $(data);
    if(processPostIfError($htmlData)){
        return null;
    }
    var lstHtmlwiParent = [];
    var $content = $("#window-content-area");
    $content.html("");
    $htmlData.children().each(function(){
        if(this.tagName == 'NOTICE'){
            defaultProcessNoticeNode(this);
            return;
        }
        var tagCommentData = getFirstChildCommentData(this);
        if(tagCommentData){
            tagCommentData = tagCommentData.replace(/ -comment->/g, '-->');
            var parentHref = this.getAttribute("parenthref");
            if(parentHref != null)
                parentHref = parentHref.trim();
            if(this.tagName == 'JAVASCRIPT')
                tagCommentData = "<script language='javascript' type='text/javascript'>" + tagCommentData + "<" + "/script>";

            if(parentHref != null && parentHref.length > 0){
                lstHtmlwiParent.push({
                    id:parentHref,
                    data: tagCommentData
                });
            }else{
                $content.append(tagCommentData);
            }
        }
    });
    for(var i = 0; i < lstHtmlwiParent.length; i++){
        if(lstHtmlwiParent[i].id){
            var parent = $(lstHtmlwiParent[i].id);
            if(parent.length == 0){
                showErrorPanel("Không có element " + lstHtmlwiParent[i].id);
                return $htmlData;
            }
            parent.html(lstHtmlwiParent[i].data);
        }
    }
    return $htmlData;
}

/**
 * Hàm xử lý thẻ thông báo từ kết quả trả về của server
 * @node (jQuery) thẻ
 * @title (String) tiêu đề của thông báo
 * @onClose (Function) hàm xử lý khi đóng thông báo.
 * return (Boolean) true nếu có hiện thẻ thông báo, flase nếu không hiện thẻ
 * thông báo
 */
function defaultProcessNoticeNode(node, title, onClose){
    var tagCommentData = getFirstChildCommentData(node);
    if(tagCommentData){
        if(!title) title = $(node).attr("title");
        if(!title) title = "Thông báo";
        showErrorPanel(tagCommentData, title, onClose);
        return true;
    }
    return false;
}
/**
 * Hàm lấy nội dung comment đầu tiên trong thẻ.
 * @node (jQuery hoặc HTMLObject) thẻ có chứ comment.
 * @return (String) chuỗi comment.
 */
function getFirstChildCommentData(node){
    if(!(node instanceof jQuery))
        node = $(node);
    var scontent = node.html();
    var indexA = scontent.indexOf("<!--");
    if(indexA < 0)
        return null;
    var indexB = scontent.lastIndexOf("-->");
    if(indexB < 0)
        return null;
    return scontent.substring(indexA + 4, indexB);
}
var prepare_timeout = 500;
var waittimeout = 0;

/**
 * Hiển thị màn đen che trang web
 */
function showDarkArea(){
    if(waittimeout == 0){
        waittimeout = setTimeout(function(){
            //            tb_show("","a?likeajax=true");
            var dark_div = $("#dark-area-prevent-click");
            if(dark_div.length == 0){
                dark_div = $("<div style='z-index:100000; width:100%; height:2000px; background-color:black; position:fixed; left:0; top:0; opacity:0.3;filter:alpha(opacity=30)' id='dark-area-prevent-click'></div>");
                $("body").append(dark_div);
            }else{
                dark_div.show();
            }

        }, prepare_timeout);
    }
}
/**
 * Ản màn đen che trang web
 */
function removeDarkArea(){
    if(waittimeout != 0)clearTimeout(waittimeout);
    $("#dark-area-prevent-click").hide();
    waittimeout = 0;
}
/**
 * Hiển thị màn hình thông báo lỗi
 */
function showErrorPanel(rsName, title, onClose){
    $('#error-board').css('display','none');
    $('#error-text').html(rsName);
    $('#error-board').show(500);
    showMessageBox(rsName, title, onClose);
}
/**
 * Ẩn màn hình thông báo lỗi
 */
function hideErrorPanel(){
    if($('#error-board').css('display') != 'none')
        $('#error-board').hide(500);
}
/**
 * Hiển thị màn hình thông báo
 */
function showMessageBox(message, title, onClose){
    $("<div class='for-clean-screen'></div>").html(message).appendTo($("#trash-area-for-remove")).dialog({
        resizable: false,
        modal: true,
        title: title,
        closeOnEscape: true,
        width: '50%',
        buttons: {
            'Đóng': function() {
                $(this).dialog('destroy');
                $(this).remove();
                if(onClose != null && onClose instanceof Function){
                    onClose();
                }
            }
        }
    });
}
/**
 * Xóa cá thẻ do các thư viện javascript sinh ra
 */
function cleanscreen(){
    $(".ui-autocomplete, .needremove, .for-clean-screen").remove();
}
/**
 * Hiển thị màn hình chọn lựa yes, no
 * @selector (String) định danh của thẻ
 * @ifok (Function) hàm xử lý nếu người dùng chọn OK
 * @ifcancel (Function) hàm xử lý nếu người dùng chọn Cancel
 * @appendDesc (String) mô tả
 */
function makeConfirmYesNo(selector, ifok, ifcancel, appendDesc){
    var $selector = $(selector);
    if($selector.length == 0) return;
    $selector = $selector.clone();
    if(appendDesc == null || appendDesc == true){
        if($selector.find('.for-makeConfirmYesNo').length == 0)
            $selector.append($("<div style='margin-top:10px' class='for-makeConfirmYesNo'>Chọn <b>Đồng ý</b> để tiếp tục, <b>Bỏ qua</b> để dừng lại</div>"))
    }else{
        $selector.find('.for-makeConfirmYesNo').remove();
    }
    $(selector).addClass('for-clean-screen').dialog({
        resizable: true,
        modal: true,
        closeOnEscape: false,
        title: "Thông báo",
        buttons: {
            'Đồng ý': function() {
                this.isok = true;
                $(this).dialog('close');
                if(ifok != null && ifok instanceof Function)
                    ifok();
            },
            'Bỏ qua': function() {
                this.isok = false;
                $(this).dialog('close');
                if(ifcancel != null && ifcancel instanceof Function)
                    ifcancel();
            }
        },
        close: function(){
            if(!this.isok && ifcancel != null && ifcancel instanceof Function)
                ifcancel();
        }
    });
}
/**
 * Hiển thị màn hình chọn yes, no không có có câu hướng dẫn
 * @selector (String) định danh của thẻ
 * @ifok (Function) hàm xử lý nếu người dùng chọn OK
 * @ifcancel (Function) hàm xử lý nếu người dùng chọn Cancel
 * @appendDesc (String) mô tả
*/
function makeConfirmYesNoWithDesc(desc, ifok, ifcancel, appendDesc){
    var selector = $("<div class='for-clean-screen'></div>").html(desc).appendTo($("#trash-area-for-remove"));
    makeConfirmYesNo(selector, ifok, ifcancel, appendDesc);
}
